package com.qfedu.proxy;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
 * CGLibD动态代理
 * 1. 添加依赖 cglib ,引入 MethodInterceptor 接口文件
 * 2. 创建一个类实现 MethodInterceptor 接口，同时实现接口中的 intercept 方法
 * 3. 在类中定义一个Objec类型的变量，并提供这个变量的有参构造器，用于传递代理对象
 * 4. 定义getproxy 方法创建并返回代理对象（代理对象是通过创建被代理类的子类来创建的）
 *
 * */
public class CGLibDynamicProxy implements MethodInterceptor{

    private  Object obj;

    public CGLibDynamicProxy(Object obj) {
        this.obj = obj;
    }

    //    产生代理对象
    public Object getProxy() {
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(obj.getClass());
        enhancer.setCallback(this);
        Object proxy = enhancer.create();
        return proxy;
    }

    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        begin();
        Object returnValue = method.invoke(obj,objects); //执行method方法（insert）通过反射调用被代理类的方法
        commit();
        return returnValue;
    }

    public  void begin(){
        System.out.println("-----------开启事务");
    }

    public  void commit(){
        System.out.println("-----------提交事务");
    }
}
